// 封装购物车模块

import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
//导入useUserStore
import { useUserStore } from './user'
//使用EleMessage提示添加购物车成功
import { ElMessage } from 'element-plus'
// 导入购物车相关接口
import { insertCartAPI, findNewCartListAPI, deleteCartAPI } from '@/apis/cart'

export const useCartStore = defineStore(
  'cart',
  () => {
    //定义userStore
    const userStore = useUserStore()
    // 判断是否登录的状态
    const isLogin = computed(() => userStore.userInfo.token)
    // 1. 定义state - cartList
    const cartList = ref([])

    // 2. 定义action - addCart
    const addCart = async (goods) => {
      console.log('sdfsfds')
      // console.log(goods);
      const { skuId, count, selected } = goods
      console.log(skuId, count, selected)
      if (isLogin.value) {
        //添加数据到购物车中
        await insertCartAPI({ skuId, count, selected })
        // 获取最新的购物车列表
        updateCart()

        //使用EleMessage提示添加购物车成功
        ElMessage({
          message: '添加购物车成功',
          type: 'success'
        })
      } else {
        console.log('添加', goods)
        // 添加购物车操作
        // 已添加过 - count + 1
        // 没有添加过 - 直接push
        console.log(goods.skuId)
        // 思路：通过匹配传递过来的商品对象中的skuId能不能在cartList中找到，找到了就是添加过
        const item = cartList.value.find((cartItem) => goods.skuId === cartItem.skuId)
        console.log(item)
        if (item) {
          //找到该商品后
          item.count++
        } else {
          cartList.value.push(goods)
        }
        //使用EleMessage提示添加购物车成功
        ElMessage({
          message: '添加购物车成功',
          type: 'success'
        })
      }
    }

    //3.删除购物车
    const delCart = async (skuId) => {
      if (isLogin.value) {
        //封装删除接口
        await deleteCartAPI(skuId)
        updateCart()
        ElMessage({
          message: '删除成功',
          type: 'success'
        })
      } else {
        //使用splice
        //使用filter方法
        const index = cartList.value.findIndex((item) => skuId === item.skuId)
        cartList.value.splice(index, 1)
        //使用fliter方法
        // 使用 filter 方法移除特定 skuId 的项
        // cartList.value = cartList.value.filter(item => item.skuId !== skuId);
        //使用EleMessage提示删除成功
        ElMessage({
          message: '删除成功',
          type: 'success'
        })
      }
    }

    //封装更新数据接口
    const updateCart = async () => {
      // 获取最新的购物车列表
      const res = await findNewCartListAPI()
      //  更新购物车列表
      console.log(res)
      cartList.value = res.data
    }
    //4.退出登录清除购物车功能
    const cartClear = () => {
      cartList.value = []
    }
    //单选功能
    const singleCheck = (skuId, selected) => {
      //   通过传来的skuid来查找具体需要需改哪一项的选中状态
      const item = cartList.value.find((item) => skuId === item.skuId)
      item.selected = selected
    }
    //   全选功能
    const allCheck = (selected) => {
      //将cartList中的每一项的selected都改为selected
      cartList.value.forEach((item) => (item.selected = selected))
    }

    //计算属性
    // 1.计算商品的总数量
    const allCount = computed(() => {
      return cartList.value.reduce((total, item) => total + item.count, 0)
    })
    // 2.计算商品的总价格
    const allPrice = computed(() => {
      return cartList.value.reduce((total, item) => total + item.count * item.price, 0)
    })
    //是否全选
    const isAll = computed(() => {
      return cartList.value.every((item) => item.selected)
    })
    //已选择数量
    const selectedCount = computed(() => {
      return cartList.value
        .filter((item) => item.selected)
        .reduce((total, item) => total + item.count, 0)
    })
    //已经选择商品价钱合计
    const selectedPrice = computed(() => {
      return cartList.value
        .filter((item) => item.selected)
        .reduce((total, item) => total + item.count * item.price, 0)
    })
    return {
      cartList,
      addCart,
      delCart,
      allCount,
      allPrice,
      singleCheck,
      isAll,
      allCheck,
      selectedCount,
      selectedPrice,
      cartClear,
      updateCart
    }
  },
  {
    persist: true //开启store持久化 购物车同步到本地
  }
)
